package od.one;

/**
 * @author: Shelly
 * @create: 2024-01-30 15:02:56
 * @version: 1.0
 * @describe: 剩余银饰的重量
 * 题目描述
 * 有 N 块二手市场收集的银饰，每块银饰的重量都是正整数，收集到的银饰会被熔化用于打造新的饰品。每一回合，从中选出三块最重的 银饰，然后一起熔掉。 假设银饰的重量分别为 x 、y 和 z ，且 x <= y <= z。 那么熔掉的可能结果如下：
 * · 如果x == y == z , 那么三块银饰都会被完全熔掉;
 * · 如果x == y且y != z , 会剩余重量为 z - y的银块无法被熔掉;
 * · 如果x != y且y == z , 会剩余重量为 y - x的银块无法被熔掉;
 * · 如果x != y且y != z , 会剩余重量为 z - y与y - x差值的银块无法被熔掉。
 * 如果剩余两块，返回较大的重量(若两块重量相同，返回任意一块皆可) ； 如果只剩下一块，返回该块的重量； 如果没有剩下，就返回 0。
 * 输入描述
 * 输入数据为两行
 * 第一行为银饰数组长度 n , 1 ≤ n ≤ 40,
 * 第二行为 n 块银饰的重量，重量的取值范围为 [1，2000]，重量之间使用空格隔开
 * 输出描述
 * 如果剩余两块，返回较大的重量(若两块重量相同，返回任意一块皆可) ； 如果只剩下一块，返回该块的重量； 如果没有剩下，就返回 0。
 * 示例一
 * 输入
 * 1  3
 * 2  1 1 1
 * 输出
 * 1  0
 * 说明
 * 选出 1 1 1 , 得到 0, 最终数组转换为 [], 最后没有剩下银块, 返回 0
 * 示例二
 * 输入
 * 1  3
 * 2  3 7 10
 * 输出
 * 1  1
 * 说明 选出 3 7 10, 需要计算 (7-3) 和(10-7)的差值，（7-3）-（10-7） = 1，所以数组转换为 [1]，剩余一块，返回该块重量，返回 1
 */
public class OD26 {
}
/*
* 解题思路
模拟一个银饰熔化的过程。在这个过程中，每次都会选择三块最重的银饰进行熔化，熔化后的结果根据这三块银饰的重量关系有不同的计算方式。这个过程会一直进行，直到剩下的银饰不足三块为止。
程序使用了一个优先队列(PriorityQueue) 来存储所有的银饰，优先队列的特性是每次取出的都是队列中最大的元素(在这个程序中，最大的元素就是最重的银饰) 。这样就可以保证每次都是选择最重的三块银饰进行熔化。
下面是一个模拟的例子，初始银饰的重量为 2，2，3，5：
* 1.首先，将所有银饰的重量添加到优先队列中，队列中的元素为：5，3，2，2。
* 2.队列中有四块银饰，所以可以进行熔化。取出最重的三块银饰，分别是5，3，2。这三块银饰的重量都不同，所以剩余的重量为(5-3)-(3-2)=1,将剩余的重量1 添加到队列中, 队列中的元素为: 2,1。
* 3.队列中只剩下两块银饰，所以不能再进行熔化。程序结束，输出剩余银饰的最大重量，即2。
所以, 对于输入4,2,2,3,5, 这个程序的输出应该是 2。
* */